package com.itheima.d3_exception;

/**
 * 目标：掌握自定义异常，以及异常的作用。
 * Java无法为这个世界上全部的问题都提供异常类来代表， 如果企业自己的某种问题，想通过异常来表示，以便用异常来管理该问题，那就需要自己来定义异常类了。
 *
 * 自定义运行时异常:(编译阶段不报错，提醒不强烈，运行时才可能出现！！)
 * 定义一个异常类继承RuntimeException.
 *  重写构造器。
 * 通过throw new 异常类(xxx)来创建异常对象并抛出。
 *
 * 自定义编译时异常:(编译阶段就报错，提醒更加强烈！)
 * 定义一个异常类继承Exception.
 * 重写构造器。
 * 通过throw new 异常类(xxx)来创建异常对象并抛出。
 */

/**
 * 异常有什么作用：
 * 1.用来查询系统bug关键参考消息
 * 2.异常可以作为方法内部的一种特殊返回值，以便通知上层调用者底层的执行情况
 *
 * throw与throws
 *  throw 抛出去这个异常对象
 *  throws 用在方法上，把方法内部的异常往上（调用者）抛
 *
 *  注意：如果有一个问题很容易犯，并且后果严重，就需要自定义编译时异常来提醒。不严重的问题，就可以用运行时异常
 */

public class ExceptionTest2 {
    public static void main(String[] args) {
        // throw 抛出去这个异常对象
        // throws 用在方法上，把方法内部的异常往上（调用者）抛
        // 需求：保存一个合法的年龄
        //调用的方法的异常throw（抛出了）异常对象，可以用try catch把这个调用的方法的异常给抓住来进行处理，也可以继续往外抛异常
        try {
            saveAge(223);
            System.out.println("底层执行成功的！");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("底层出现了bug!");
        }

        try {
            saveAge2(225);
            System.out.println("saveAge2底层执行是成功的！");
        } catch (AgeIllegalException e) {
            e.printStackTrace();
            System.out.println("saveAge2底层执行是出现bug的！");
        }

        saveAge(299);       //运行时异常，编译的时候不提醒报错
        //saveAge2(228);    //编译时异常，一写就会报错提示
    }


    //自定义的编译时异常：在写出来的时候就会一直报错，所以要throws往上抛
    public static void saveAge2(int age) throws AgeIllegalException{   //如果不抛出throws AgeIllegalException，在编译阶段就会一直报错
        if(age > 0 && age < 150){
            System.out.println("年龄被成功保存： " + age);
        }else {
            // 用一个异常对象封装这个问题
            // throw 抛出去这个异常对象
            // throws 用在方法上，抛出方法内部的异常
            throw new AgeIllegalException("/age is illegal, your age is " + age);
        }
    }

    public static void saveAge(int age){
        if(age > 0 && age < 150){
            System.out.println("年龄被成功保存： " + age);
        }else {
            // 用一个异常对象封装这个问题
            // throw 抛出去这个异常对象
            throw new AgeIllegalRuntimeException("/age is illegal, your age is " + age);
        }
    }
}
